<!-- 装修基础组件：悬浮按钮 -->
<template>
  <!-- 模态背景：展开时显示，点击后折叠 -->
  <view v-if="fabRef?.isShow" class="modal-bg" @click="handleCollapseFab"></view>
  <!-- 悬浮按钮 -->
  <uni-fab
    ref="fabRef"
    horizontal="right"
    vertical="bottom"
    :direction="state.direction"
    :pattern="state.pattern"
    :content="state.content"
    @trigger="handleOpenLink"
  />
</template>
<script setup>
/**
 * 悬浮按钮
 */

import sheep from '@/sheep'
import { reactive, ref, unref } from 'vue'
import { onBackPress } from '@dcloudio/uni-app'

// 定义属性
const props = defineProps({
  data: {
    type: Object,
    default() {},
  },
})

// 悬浮按钮配置： https://uniapp.dcloud.net.cn/component/uniui/uni-fab.html#fab-props
const state = reactive({
  // 可选样式配置项
  pattern: [],
  // 展开菜单内容配置项
  content: [],
  // 展开菜单显示方式：horizontal-水平显示，vertical-垂直显示
  direction: '',
})

// 悬浮按钮引用
const fabRef = ref(null)
// 按钮方向
state.direction = props.data.direction
props.data?.list.forEach((item) => {
  // 按钮文字
  const text = props.data?.showText ? item.text : ''
  // 生成内容配置项
  state.content.push({ iconPath: sheep.$url.cdn(item.imgUrl), url: item.url, text })
  // 生成样式配置项
  state.pattern.push({ color: item.textColor })
})

// 处理链接跳转
function handleOpenLink(e) {
  sheep.$router.go(e.item.url)
}

// 折叠
function handleCollapseFab() {
  if (unref(fabRef)?.isShow) {
    unref(fabRef)?.close()
  }
}

// 按返回值后，折叠悬浮按钮
onBackPress(() => {
  if (unref(fabRef)?.isShow) {
    unref(fabRef)?.close()
    return true
  }
  return false
})
</script>
<style lang="scss" scoped>
/* 模态背景 */
.modal-bg {
  position: fixed;
  left: 0;
  top: 0;
  z-index: 11;
  width: 100%;
  height: 100%;
  background-color: rgba(#000000, 0.4);
}
</style>
